<?php

/**
 * Description of XQL_DataSurce_RecordDataProvider
 *
 * @author prometheus
 */
class XQL_DataSource_RecordProvider extends x10_Provider
{
    /**
	 * @var XQL_DataSource_RecordManager
	 */
	public $recordManager;

	/**
	 * @var XQL_Statement
	 */
    public $xqlStatement;

	/**
	 * Ebben kerülnek tárolásra a rekord adatai.
	 * @var Array
	 */
	protected $data = array();

	/**
	 * A mezők alapértelmezett értékeit tartalmazó tulajdonság.
	 * @var Mixed
	 */
	protected $defaults = array();

	/**
	 * TRUE, ha a rekord törlésre lett jelölve.
	 * @var Bool
	 */
	protected $isDeleted = FALSE;

	/**
	 * TRUE, ha a rekord módosult.
	 * @var Bool
	 */
	protected $isUpdated = FALSE;

	/**
	 * TRUE, ha a rekord frissen lett létrehozva.
	 * @var Bool
	 */
	protected $isNew = FALSE;

	/**
	 * Annak a táblamezőnek a neve, amely jelzi, hogy a rekord töröltnek
	 * tekintendő. Ha ez a tulajdonság értéket kap, a rekord nem lesz ténylegesen
	 * törölve az adatbázis táblából.
	 * @var String
	 */
	protected $dirtyField = '';

	public function __construct(x10_Config $config=NULL)
	{
		parent::__construct($config);

		$this->defaults = $this->config->getConfigKey('defaults');
		$this->xqlStatement = $this->config->getConfigKey('xqlStatement');
		$this->dirtyField = $this->config->getConfigKey('dirtyField');

		$this->data = $this->defaults;

		if (is_null($this->xqlStatement)) $this->isNew = TRUE;
	}

	/**
	 * Visszatér az objektum által kezelt adatokkal, nyers formában.
	 * @return Array
	 */
	public function export()
	{
		return $this->data;
	}

	/**
	 * Mágikus set metódus.
	 * Egy mező értékének módosításakor ellenőrzi, hogy létezik-e <i>setMezőNeve()</i>
	 * metódus - amennyiben igen, arra bízza az értékadást, amennyiben nem, úgy
	 * az objektum {@link #$data} tulajdonságában tárolja az értéket.
	 * @param String $fieldName
	 * @param Mixed $value
	 */
	public function __set($fieldName, $value)
	{
		$mn = 'set'.ucfirst($fieldName);
		$this->isUpdated = TRUE;
		if (method_exists($this, $method)) $this->$mn($value);
		else $this->data[$fieldName] = $value;
	}

	/**
	 * Mágikus get metódus.
	 * Egy mező értékét adja vissza. Ellenőrzi, hogy létezik-e <i>getMezőNeve()</i>
	 * metódus és amennyiben igen, úgy a mező értékét az a metódus fogja visszaadni.
	 * @param String $fieldName
	 * @return Mixed
	 */
	public function __get($fieldName)
	{
		$mn = 'get'.ucfirst($fieldName);
		if (method_exists($this, $method)) return $this->$mn();
		else return $this->data[$fieldName];
	}

	/**
	 * Törlésre jelöli a mezőt, vagy a {@link #$dirtyField} értékének megfelelő
	 * mező értékét 1-re állítja. A törlésre jelölt mező ténylegesen törlésre
	 * kerül az adatforrás mentésekor, ha nem "piszkos" módon kerül jelölésre.
	 */
	public function delete()
	{
		$this->isDeleted = TRUE;
		$df = $this->dirtyField;
		if (!is_empty($df)) $this->$df = 1;
	}

	public function isUpdated()
	{
		return $this->isUpdated;
	}

	public function isDeleted()
	{
		return $this->isDeleted;
	}

	public function isNew()
	{
		return $this->isNew;
	}
}
?>
